{"componentChunkName":"component---src-templates-blog-post-blog-post-js","path":"/articulos/organic-driven-development-odd/","result":{"data":{"mdx":{"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Organic Driven Development (ODD): una nueva forma de desarrollar software con agentes de IA\",\n  \"date\": \"2026-10-28\",\n  \"description_sort\": \"Qué es Organic Driven Development (ODD) y cómo organiza el trabajo de agentes de IA\",\n  \"description\": \"Descubre qué es Organic Driven Development (ODD), cómo funciona la metodología de Gentleman Programming y en qué se diferencia de Spec-Driven Development para programar con agentes de IA.\",\n  \"featuredImage\": \"organic-driven-development-portada.webp\",\n  \"twitterUsername\": \"@CursosDesarrol1\",\n  \"tags\": [\"inteligencia-artificial\", \"agentes-ia\", \"desarrollo-software\", \"organic-driven-development\", \"spec-driven-development\", \"codex\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"span\", {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/43b0e4ece798c9ac8b17f16eb73252b9/5bb53/organic-driven-development-portada.webp\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"56.333333333333336%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/webp;base64,UklGRpQAAABXRUJQVlA4IIgAAAAQBACdASoUAAsAPtFUo0uoJKMhsAgBABoJbACdMoAluhWlqV/ppk47gAD+6HKWpwv5MDVqTg1vqulCg+rola6DbErTBPmcVfxM/Hpf5Kp8FKSBeywXViqvrrhY0L0oavExpA/ZwArMmFcLUtl9SMzBKx0TQ4kyykIOZFh0eCalHIT6Jp5XeAAA')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Ilustración editorial de una persona y un agente de IA organizando de forma proporcional una tarea de desarrollo\",\n    \"title\": \"Ilustración editorial de una persona y un agente de IA organizando de forma proporcional una tarea de desarrollo\",\n    \"src\": \"/static/43b0e4ece798c9ac8b17f16eb73252b9/5bb53/organic-driven-development-portada.webp\",\n    \"srcSet\": [\"/static/43b0e4ece798c9ac8b17f16eb73252b9/cb58d/organic-driven-development-portada.webp 300w\", \"/static/43b0e4ece798c9ac8b17f16eb73252b9/f8b1b/organic-driven-development-portada.webp 600w\", \"/static/43b0e4ece798c9ac8b17f16eb73252b9/5bb53/organic-driven-development-portada.webp 1200w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), mdx(\"br\", null), mdx(\"br\", null), mdx(\"h1\", null, \"Organic Driven Development (ODD): una nueva forma de desarrollar software con agentes de IA\"), mdx(\"br\", null), mdx(\"p\", null, \"La inteligencia artificial est\\xE1 cambiando la forma en la que desarrollamos aplicaciones, pero tambi\\xE9n est\\xE1 poniendo de manifiesto un problema que hasta hace poco apenas nos plante\\xE1bamos: \\xBFc\\xF3mo debemos organizar el trabajo cuando quien escribe buena parte del c\\xF3digo es un agente de IA?\"), mdx(\"p\", null, \"Herramientas como Claude Code, Codex, Cursor u OpenCode permiten delegar tareas que antes realiz\\xE1bamos manualmente. Pueden analizar proyectos, modificar archivos, ejecutar pruebas y proponer implementaciones completas.\"), mdx(\"p\", null, \"Sin embargo, disponer de un agente capaz de generar c\\xF3digo no garantiza que el proceso sea eficiente. Puede modificar archivos sin comprender el proyecto, generar documentaci\\xF3n innecesaria, perder el contexto de una implementaci\\xF3n o introducir cambios que nadie hab\\xEDa solicitado.\"), mdx(\"p\", null, \"Para abordar estos problemas est\\xE1n apareciendo metodolog\\xEDas orientadas espec\\xEDficamente al desarrollo asistido por inteligencia artificial. Una de ellas es \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Organic Driven Development (ODD)\"), \", un enfoque incorporado al ecosistema Gentle-AI de Gentleman Programming.\"), mdx(\"p\", null, \"Su propuesta es sencilla: adaptar el proceso de desarrollo a las necesidades reales de cada tarea, utilizando \\xFAnicamente el nivel de planificaci\\xF3n, documentaci\\xF3n y verificaci\\xF3n necesario. Pero detr\\xE1s de esa idea hay decisiones interesantes desde el punto de vista de la ingenier\\xEDa de software.\"), mdx(\"h2\", null, \"\\xBFQu\\xE9 es Organic Driven Development?\"), mdx(\"p\", null, \"Organic Driven Development, o simplemente ODD, es un flujo de trabajo para desarrollar software con agentes de IA que ajusta la organizaci\\xF3n y la ejecuci\\xF3n seg\\xFAn la complejidad, el riesgo y el grado de comprensi\\xF3n de la tarea.\"), mdx(\"p\", null, \"Su objetivo es evitar dos extremos habituales. El primero consiste en pedir directamente a un agente que implemente una funcionalidad sin an\\xE1lisis suficiente. El segundo impone un proceso de planificaci\\xF3n excesivamente complejo incluso para cambios triviales.\"), mdx(\"p\", null, \"ODD busca un equilibrio: una modificaci\\xF3n sencilla puede resolverse despu\\xE9s de examinar el c\\xF3digo relevante; una funcionalidad importante puede necesitar investigaci\\xF3n, documentaci\\xF3n persistente, divisi\\xF3n en tareas, pruebas y revisiones. \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"El flujo es com\\xFAn, pero su ejecuci\\xF3n se adapta al trabajo.\")), mdx(\"p\", null, \"Conviene aclarar que ODD no es una arquitectura de aplicaci\\xF3n. No define c\\xF3mo organizar controladores, servicios, entidades o m\\xF3dulos. Es una metodolog\\xEDa operativa: establece c\\xF3mo debe comportarse un agente durante el desarrollo.\"), mdx(\"h2\", null, \"El problema que intenta solucionar ODD\"), mdx(\"p\", null, \"Los primeros asistentes de programaci\\xF3n devolv\\xEDan c\\xF3digo y el desarrollador decid\\xEDa si incorporarlo. Los agentes actuales pueden asumir operaciones mucho m\\xE1s amplias:\"), mdx(\"br\", null), mdx(CodeJs, {\n    mdxType: \"CodeJs\"\n  }, \"Implementa un sistema de recuperaci\\xF3n de contrase\\xF1a.\", mdx(\"br\", null), mdx(\"br\", null), \"Utiliza el sistema de autenticaci\\xF3n existente.\", mdx(\"br\", null), \"A\\xF1ade los endpoints necesarios.\", mdx(\"br\", null), \"Crea las pruebas.\", mdx(\"br\", null), \"Actualiza la documentaci\\xF3n.\"), mdx(\"br\", null), mdx(\"p\", null, \"Un agente puede intentar completar todo el proceso. El problema aparece cuando la petici\\xF3n es ambigua o desconoce decisiones importantes del proyecto: quiz\\xE1 existe un servicio de correo reutilizable, se deben registrar las operaciones de seguridad o los tokens tienen restricciones concretas.\"), mdx(\"p\", null, \"Si empieza a programar inmediatamente puede entregar una soluci\\xF3n funcional, pero incompatible con la arquitectura existente. Obligarle a planificar primero parece la respuesta, aunque plantea otra pregunta: \\xBFtiene sentido exigir una especificaci\\xF3n y un plan completos para corregir una errata? Probablemente no. Precisamente ah\\xED aparece ODD.\"), mdx(\"h2\", null, \"De Spec-Driven Development a Organic Driven Development\"), mdx(\"p\", null, \"Una metodolog\\xEDa relevante para los agentes es \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Spec-Driven Development (SDD)\"), \". Su planteamiento usa especificaciones estructuradas para dirigir la implementaci\\xF3n.\"), mdx(\"br\", null), mdx(CodeJs, {\n    mdxType: \"CodeJs\"\n  }, \"Exploraci\\xF3n \\u2192 Propuesta \\u2192 Especificaci\\xF3n \\u2192 Dise\\xF1o\", mdx(\"br\", null), \"Planificaci\\xF3n de tareas \\u2192 Implementaci\\xF3n \\u2192 Verificaci\\xF3n \\u2192 Cierre\"), mdx(\"br\", null), mdx(\"p\", null, \"Este procedimiento es \\xFAtil para funcionalidades complejas o decisiones importantes, pero generar y mantener documentos requiere tiempo, contexto y recursos del modelo. Si una tarea solo cambia un mensaje de error, recorrer todas las etapas aporta poco valor.\"), mdx(\"p\", null, \"ODD cambia el criterio: en lugar de exigir siempre la misma documentaci\\xF3n, determina qu\\xE9 necesita cada cambio.\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Situaci\\xF3n\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Enfoque ODD\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Corregir un texto\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Explorar y modificar directamente\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Resolver un error localizado\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Investigar, reproducir, corregir y verificar\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"A\\xF1adir una funcionalidad importante\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Crear documentaci\\xF3n recuperable y dividir el trabajo\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Modificar autenticaci\\xF3n\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Evaluar riesgos, aplicar controles y verificar\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Investigar una mejora\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Analizar sin modificar c\\xF3digo\")))), mdx(\"p\", null, \"SDD no desaparece: dentro de Gentle-AI puede seguir utiliz\\xE1ndose cuando se solicita un proceso formal de especificaci\\xF3n. ODD se convierte en el flujo habitual.\"), mdx(\"span\", {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/f861c738948aa9f84e1ba30cc576e93c/5bb53/organic-driven-development-flujo.webp\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"50%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/webp;base64,UklGRogAAABXRUJQVlA4IHwAAAAwBACdASoUAAoAPtFWpEuoJKOhsAgBABoJYwCdAdwLgTcqe7zA+heFgaAA/u2rIut+AhVVmZQs4wAtkwtjtLjCRtstz8AhQiZCKYydRhsYRKPiz2u9wPKhfC2Y6k/Lan5StNfSJDnFAubLvuF6q6LL4npogEe5+nEsAAAA')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Diagrama editorial de dos rutas de trabajo: una corta para una tarea sencilla y otra con más controles para un cambio de riesgo\",\n    \"title\": \"Diagrama editorial de dos rutas de trabajo: una corta para una tarea sencilla y otra con más controles para un cambio de riesgo\",\n    \"src\": \"/static/f861c738948aa9f84e1ba30cc576e93c/5bb53/organic-driven-development-flujo.webp\",\n    \"srcSet\": [\"/static/f861c738948aa9f84e1ba30cc576e93c/cb58d/organic-driven-development-flujo.webp 300w\", \"/static/f861c738948aa9f84e1ba30cc576e93c/f8b1b/organic-driven-development-flujo.webp 600w\", \"/static/f861c738948aa9f84e1ba30cc576e93c/5bb53/organic-driven-development-flujo.webp 1200w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), mdx(\"br\", null), mdx(\"br\", null), mdx(\"h2\", null, \"Las siete etapas de Organic Driven Development\"), mdx(\"p\", null, \"La implementaci\\xF3n documentada de ODD en Gentle-AI se organiza en siete etapas. No deben entenderse como siete documentos obligatorios, sino como reglas de comportamiento para el agente.\"), mdx(\"h3\", null, \"1. Authorize: comprobar qu\\xE9 est\\xE1 autorizado\"), mdx(\"p\", null, \"El primer paso es determinar si el usuario ha pedido realmente modificar el proyecto. La diferencia entre \\xABanaliza c\\xF3mo funciona el m\\xF3dulo de autenticaci\\xF3n\\xBB y \\xABmodifica el m\\xF3dulo para a\\xF1adir tokens de actualizaci\\xF3n\\xBB es fundamental: la primera instrucci\\xF3n autoriza una investigaci\\xF3n y la segunda una implementaci\\xF3n.\"), mdx(\"p\", null, \"ODD establece que las solicitudes de investigaci\\xF3n, explicaci\\xF3n o an\\xE1lisis se mantienen en modo de solo lectura salvo que exista autorizaci\\xF3n para cambiar archivos. Esto reduce el riesgo de modificaciones inesperadas.\"), mdx(\"h3\", null, \"2. Explore: comprender antes de implementar\"), mdx(\"p\", null, \"Una vez identificada la intenci\\xF3n, el agente examina el contexto relevante. No necesita leer todo el repositorio: necesita entender lo suficiente para decidir bien. En una aplicaci\\xF3n NestJS que va a incorporar un endpoint deber\\xEDa revisar c\\xF3mo se organizan m\\xF3dulos, servicios, autorizaci\\xF3n y convenciones.\"), mdx(\"br\", null), mdx(CodeJs, {\n    mdxType: \"CodeJs\"\n  }, \"src/\", mdx(\"br\", null), \"\\xA0 auth/\", mdx(\"br\", null), \"\\xA0\\xA0 auth.controller.ts\", mdx(\"br\", null), \"\\xA0\\xA0 auth.service.ts\", mdx(\"br\", null), \"\\xA0\\xA0 auth.module.ts\", mdx(\"br\", null), mdx(\"br\", null), \"\\xA0 users/\", mdx(\"br\", null), \"\\xA0\\xA0 users.controller.ts\", mdx(\"br\", null), \"\\xA0\\xA0 users.service.ts\", mdx(\"br\", null), \"\\xA0\\xA0 users.module.ts\"), mdx(\"br\", null), mdx(\"p\", null, \"Si la funcionalidad ya dispone de servicios reutilizables, el agente deber\\xEDa identificarlos. ODD intenta evitar que la generaci\\xF3n de c\\xF3digo preceda a la comprensi\\xF3n del sistema.\"), mdx(\"h3\", null, \"3. Resolve uncertainty: resolver incertidumbres reales\"), mdx(\"p\", null, \"Los agentes pueden tomar decisiones por su cuenta, pero no todas las decisiones deber\\xEDan delegarse. Ante \\xABa\\xF1ade la posibilidad de eliminar usuarios\\xBB, \\xBFeliminar significa borrar f\\xEDsicamente el registro o desactivarlo? La respuesta afecta al modelo de datos, las relaciones, el hist\\xF3rico y quiz\\xE1 a requisitos legales.\"), mdx(\"p\", null, \"ODD contempla investigar las incertidumbres relevantes y solicitar aclaraciones cuando exista una decisi\\xF3n real de producto. La clave es evitar tanto las suposiciones arriesgadas como las preguntas innecesarias.\"), mdx(\"h3\", null, \"4. Classify: determinar el tama\\xF1o real del trabajo\"), mdx(\"p\", null, \"La complejidad no se calcula contando archivos o l\\xEDneas. Una modificaci\\xF3n de tres archivos puede ser sencilla; una l\\xEDnea que afecte a autenticaci\\xF3n puede ser delicada. ODD considera si la tarea est\\xE1 comprendida, si existen riesgos, si puede completarse y revisarse de manera localizada y si ser\\xEDa posible retomarla despu\\xE9s de una interrupci\\xF3n con la petici\\xF3n original y el diff.\"), mdx(\"p\", null, \"Una tarea peque\\xF1a y comprendida puede ejecutarse sin documentaci\\xF3n persistente. Una tarea sustancial que debe conservar contexto requiere otro tratamiento.\"), mdx(\"h3\", null, \"5. Track: registrar el trabajo cuando sea necesario\"), mdx(\"p\", null, \"Cuando una implementaci\\xF3n es suficientemente importante, ODD introduce un documento de seguimiento. En Gentle-AI puede utilizarse una estructura como esta:\"), mdx(\"br\", null), mdx(CodeJs, {\n    mdxType: \"CodeJs\"\n  }, \"odd/\", mdx(\"br\", null), \"\\xA0 tasks/\", mdx(\"br\", null), \"\\xA0\\xA0 password-recovery.md\"), mdx(\"br\", null), mdx(\"p\", null, \"El documento recoge alcance, requisitos, tareas, estado y evidencias. Una versi\\xF3n simplificada podr\\xEDa incluir requisitos para solicitar un enlace, caducidad de 30 minutos y uso \\xFAnico del token; adem\\xE1s de una lista de tareas para implementar generaci\\xF3n, validaci\\xF3n, endpoint, pruebas y documentaci\\xF3n.\"), mdx(\"p\", null, \"Lo importante no es el formato exacto, sino que funciona como una referencia persistente. Si el agente pierde el contexto o el trabajo se interrumpe, puede retomarlo sin reconstruir todo el proceso desde cero.\"), mdx(\"h3\", null, \"6. Implement: implementar y verificar proporcionalmente\"), mdx(\"p\", null, \"Tras comprender y organizar la tarea comienza la implementaci\\xF3n. ODD propone usar el mecanismo de ejecuci\\xF3n m\\xE1s peque\\xF1o que aporte valor: trabajar directamente en un cambio sencillo o delegar partes independientes a agentes especializados cuando est\\xE9 justificado.\"), mdx(\"p\", null, \"Tambi\\xE9n contempla pruebas antes de implementar cuando hay un comportamiento verificable y un mecanismo de testing adecuado.\"), mdx(\"br\", null), mdx(CodeJs, {\n    mdxType: \"CodeJs\"\n  }, \"Prueba que reproduce el fallo\", mdx(\"br\", null), \"\\u2193\", mdx(\"br\", null), \"Implementaci\\xF3n de la correcci\\xF3n\", mdx(\"br\", null), \"\\u2193\", mdx(\"br\", null), \"Prueba superada\", mdx(\"br\", null), \"\\u2193\", mdx(\"br\", null), \"Refactorizaci\\xF3n\"), mdx(\"br\", null), mdx(\"p\", null, \"El enfoque se relaciona con TDD, aunque ODD no es otra denominaci\\xF3n para \\xE9l. La diferencia clave es exigir evidencias reales: que un agente afirme que algo funciona no equivale a demostrarlo.\"), mdx(\"h3\", null, \"7. Close: cerrar con resultados verificables\"), mdx(\"p\", null, \"La \\xFAltima etapa informa del resultado distinguiendo claramente qu\\xE9 se ha implementado, qu\\xE9 se ha verificado y qu\\xE9 queda pendiente.\"), mdx(\"br\", null), mdx(CodeJs, {\n    mdxType: \"CodeJs\"\n  }, \"Implementado:\", mdx(\"br\", null), \"\\u2022 Nuevo endpoint\", mdx(\"br\", null), \"\\u2022 Validaci\\xF3n de tokens\", mdx(\"br\", null), \"\\u2022 Pruebas unitarias\", mdx(\"br\", null), mdx(\"br\", null), \"Verificado:\", mdx(\"br\", null), \"\\u2022 Compilaci\\xF3n correcta\", mdx(\"br\", null), \"\\u2022 Pruebas ejecutadas\", mdx(\"br\", null), mdx(\"br\", null), \"Pendiente:\", mdx(\"br\", null), \"\\u2022 Prueba E2E con servicio de correo real\"), mdx(\"br\", null), mdx(\"p\", null, \"Esta distinci\\xF3n evita presentar una implementaci\\xF3n como terminada cuando todav\\xEDa hay verificaciones pendientes.\"), mdx(\"h2\", null, \"El papel de la memoria persistente\"), mdx(\"p\", null, \"Los agentes trabajan con ventanas de contexto limitadas. Incluso cuando son grandes, los proyectos reales pueden requerir sesiones largas o m\\xFAltiples intervenciones. Un agente puede descubrir una restricci\\xF3n arquitect\\xF3nica y perderla antes de terminar la funcionalidad.\"), mdx(\"p\", null, \"Gentle-AI utiliza Engram como sistema de memoria persistente para conservar decisiones, descubrimientos y contexto entre sesiones. ODD combina esa memoria con documentos de trabajo para retomar tareas relevantes. No es la memoria temporal del modelo: es informaci\\xF3n recuperable fuera de la conversaci\\xF3n activa.\"), mdx(\"h2\", null, \"Un ejemplo pr\\xE1ctico: ODD en React y NestJS\"), mdx(\"p\", null, \"Supongamos una aplicaci\\xF3n con React, NestJS, PostgreSQL y TypeORM. La petici\\xF3n es permitir que un usuario solicite modificar un registro, guarde el motivo y un administrador pueda aprobar o rechazar la solicitud. La aprobaci\\xF3n debe mantener el estado anterior, aplicar el cambio en una transacci\\xF3n e incluir pruebas de ambos resultados.\"), mdx(\"p\", null, \"El agente empezar\\xEDa investigando registros, entidades de usuarios y permisos, adem\\xE1s de comprobar si ya existen auditor\\xEDas o transacciones reutilizables. No es un cambio de texto: hay estados, persistencia, permisos y operaciones que afectan a varios registros. Por tanto, es razonable crear \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"odd/tasks/record-modification.md\"), \" con requisitos y tareas.\"), mdx(\"p\", null, \"La implementaci\\xF3n puede avanzar desde el modelo de datos a servicios y transacciones, endpoints y permisos, interfaz y pruebas. No siempre conviene lanzar varios agentes: si modifican entidades o servicios simult\\xE1neamente, aumentan los conflictos.\"), mdx(\"p\", null, \"La validaci\\xF3n deber\\xEDa confirmar que una solicitud no aprobada no cambia el registro, un usuario sin permiso no puede aprobar, el hist\\xF3rico conserva los datos anteriores y un fallo de transacci\\xF3n no deja datos parcialmente modificados.\"), mdx(\"span\", {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/beda4c49f4d0e3e87384f3f489bef53c/5bb53/organic-driven-development-verificacion.webp\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"66.66666666666666%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/webp;base64,UklGRqQAAABXRUJQVlA4IJgAAADQAwCdASoUAA0APtFUo0uoJKMhsAgBABoJZACdMoADMR+xJ6UoqgAA/uDaOpxa/6GLMCbygpAcTJhEZClFPv7MQr0LXHasOcq4vmkhztcvPh4EE7ChVAVfiIvYmhgKAEOsTGFg6knudrOqFxdMqunkuvs5JjvDRQ4u/tThym1GsgXPRZvef4OZVAqS3+xEAmnuvxxYhpcAAA==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Ilustración de desarrolladores revisando resultados y evidencias de pruebas junto a un agente de IA\",\n    \"title\": \"Ilustración de desarrolladores revisando resultados y evidencias de pruebas junto a un agente de IA\",\n    \"src\": \"/static/beda4c49f4d0e3e87384f3f489bef53c/5bb53/organic-driven-development-verificacion.webp\",\n    \"srcSet\": [\"/static/beda4c49f4d0e3e87384f3f489bef53c/cb58d/organic-driven-development-verificacion.webp 300w\", \"/static/beda4c49f4d0e3e87384f3f489bef53c/f8b1b/organic-driven-development-verificacion.webp 600w\", \"/static/beda4c49f4d0e3e87384f3f489bef53c/5bb53/organic-driven-development-verificacion.webp 1200w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), mdx(\"br\", null), mdx(\"br\", null), mdx(\"h2\", null, \"\\xBFQu\\xE9 diferencia ODD de Agile, TDD y Clean Architecture?\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Enfoque\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Problema principal que aborda\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Agile\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Organizaci\\xF3n del trabajo y adaptaci\\xF3n al cambio\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"TDD\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Desarrollo dirigido por pruebas\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Clean Architecture\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Organizaci\\xF3n de dependencias y responsabilidades\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"SDD\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Desarrollo guiado por especificaciones\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"ODD\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Organizaci\\xF3n proporcional del trabajo ejecutado por agentes\")))), mdx(\"p\", null, \"ODD no sustituye necesariamente a los dem\\xE1s. Podemos aplicar Clean Architecture a la aplicaci\\xF3n, TDD a la l\\xF3gica de negocio y ODD a la forma de organizar el trabajo del agente: son niveles distintos.\"), mdx(\"h2\", null, \"Ventajas de Organic Driven Development\"), mdx(\"p\", null, \"La principal ventaja es reducir burocracia sin eliminar controles. Ajusta la organizaci\\xF3n al trabajo real y puede aportar:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Menos documentaci\\xF3n innecesaria:\"), \" los cambios sencillos no requieren una colecci\\xF3n de documentos.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Mayor continuidad entre sesiones:\"), \" las tareas importantes conservan requisitos, decisiones y estado recuperables.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Mejor control de modificaciones:\"), \" diferenciar investigaci\\xF3n e implementaci\\xF3n limita cambios no solicitados.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Verificaci\\xF3n basada en evidencias:\"), \" se reconocen expl\\xEDcitamente las comprobaciones pendientes.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Menor dependencia de instrucciones manuales:\"), \" el flujo habitual no exige pedir cada etapa por separado.\")), mdx(\"h2\", null, \"Limitaciones de ODD\"), mdx(\"p\", null, \"La metodolog\\xEDa tiene ideas razonables, pero no todas sus decisiones est\\xE1n validadas emp\\xEDricamente para cualquier proyecto.\"), mdx(\"h3\", null, \"La clasificaci\\xF3n puede fallar\"), mdx(\"p\", null, \"Determinar qu\\xE9 es sencillo y qu\\xE9 es sustancial requiere juicio. \\xABModifica la duraci\\xF3n de los tokens de sesi\\xF3n\\xBB quiz\\xE1 sea una l\\xEDnea, pero puede tener consecuencias de seguridad importantes.\"), mdx(\"h3\", null, \"No elimina los errores de los modelos\"), mdx(\"p\", null, \"ODD proporciona reglas de trabajo; no garantiza que la IA comprenda requisitos ni produzca c\\xF3digo seguro.\"), mdx(\"h3\", null, \"La memoria puede quedar desactualizada\"), mdx(\"p\", null, \"La informaci\\xF3n persistente solo ayuda si refleja el estado real del proyecto. Una memoria incorrecta introduce errores dif\\xEDciles de detectar.\"), mdx(\"h3\", null, \"La implementaci\\xF3n importa tanto como la metodolog\\xEDa\"), mdx(\"p\", null, \"Hay una diferencia entre describir un protocolo en instrucciones y disponer de un sistema que compruebe su cumplimiento. Un modelo puede ignorar una regla o afirmar que verific\\xF3 algo sin hacerlo. Por eso los controles ejecutables, los tests y la revisi\\xF3n humana siguen siendo necesarios.\"), mdx(\"h2\", null, \"\\xBFTiene sentido utilizar ODD en cualquier proyecto?\"), mdx(\"p\", null, \"No necesariamente. Para un script peque\\xF1o o una aplicaci\\xF3n de prueba, incorporar memoria y seguimiento puede ser innecesario. Puede resultar m\\xE1s \\xFAtil en repositorios grandes, desarrollo continuado, m\\xF3dulos relacionados, uso frecuente de agentes, requisitos de trazabilidad, riesgo de regresi\\xF3n o tareas que deben retomarse entre sesiones.\"), mdx(\"p\", null, \"Tambi\\xE9n es \\xFAtil para equipos que usan agentes pero a\\xFAn no tienen criterios comunes sobre cu\\xE1ndo investigar, documentar, implementar o verificar. ODD no deber\\xEDa convertirse en otra fuente de complejidad: si aplicarlo cuesta m\\xE1s que resolver el problema, contradice su prop\\xF3sito.\"), mdx(\"h2\", null, \"El verdadero cambio est\\xE1 en c\\xF3mo organizamos el desarrollo\"), mdx(\"p\", null, \"Las metodolog\\xEDas se dise\\xF1aron durante mucho tiempo alrededor del trabajo humano. Los agentes introducen un participante que puede ejecutar partes relevantes del proceso y obligan a replantear preguntas: \\xBFcu\\xE1ndo puede actuar aut\\xF3nomamente?, \\xBFcu\\xE1ndo requiere autorizaci\\xF3n?, \\xBFqu\\xE9 informaci\\xF3n debe conservar?, \\xBFqu\\xE9 cambios requieren pruebas?, \\xBFcu\\xE1ndo merece la pena delegar y c\\xF3mo demostramos que el resultado es correcto?\"), mdx(\"p\", null, \"ODD propone respuestas operativas sin imponer un procedimiento pesado a todas las tareas. Su planteamiento es utilizar el nivel de proceso adecuado para cada situaci\\xF3n.\"), mdx(\"h2\", null, \"Conclusi\\xF3n\"), mdx(\"p\", null, \"Organic Driven Development re\\xFAne pr\\xE1cticas conocidas \\u2014investigar antes de programar, trabajar en tareas peque\\xF1as, conservar decisiones y verificar resultados\\u2014 en un flujo que adapta su aplicaci\\xF3n al trabajo de un agente.\"), mdx(\"p\", null, \"Frente a metodolog\\xEDas r\\xEDgidas, propone una organizaci\\xF3n proporcional: poca ceremonia para un cambio sencillo y mayor trazabilidad para un trabajo complejo. Conviene mantener una mirada cr\\xEDtica: ODD es una propuesta reciente vinculada a Gentle-AI, no un est\\xE1ndar consolidado ni una garant\\xEDa de calidad. Su utilidad depender\\xE1 de la implementaci\\xF3n, la fiabilidad de los agentes y los mecanismos de verificaci\\xF3n.\"), mdx(\"p\", null, \"La cuesti\\xF3n ya no es solo si un agente puede escribir c\\xF3digo. \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Tambi\\xE9n debemos decidir bajo qu\\xE9 condiciones puede modificar nuestro software y c\\xF3mo comprobaremos que su trabajo es correcto.\"), \" Ese es el problema que Organic Driven Development intenta resolver.\"), mdx(\"h2\", null, \"Fuentes y referencias\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://gentlemanprogramming.com/\"\n  }, \"Gentleman Programming \\u2014 sitio oficial\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://github.com/Gentleman-Programming/gentle-ai\"\n  }, \"Gentle-AI \\u2014 repositorio oficial en GitHub\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://github.com/Gentleman-Programming/gentle-ai/blob/main/docs/usage.md\"\n  }, \"Gentle-AI \\u2014 documentaci\\xF3n de uso y protocolo ODD\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://github.com/Gentleman-Programming/gentle-ai/blob/main/docs/intended-usage.md\"\n  }, \"Gentle-AI \\u2014 modelo de uso y diferencias entre ODD y SDD\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://github.com/Gentleman-Programming/gentle-shell\"\n  }, \"Gentle Shell \\u2014 implementaci\\xF3n de ODD en un entorno de agentes\"))));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"twitterUsername":"@CursosDesarrol1","title":"Organic Driven Development (ODD): una nueva forma de desarrollar software con agentes de IA","seoTitle":null,"date":"2026-10-28","description":"Descubre qué es Organic Driven Development (ODD), cómo funciona la metodología de Gentleman Programming y en qué se diferencia de Spec-Driven Development para programar con agentes de IA.","featuredImage":{"childImageSharp":{"fluid":{"base64":"data:image/webp;base64,UklGRpQAAABXRUJQVlA4IIgAAAAQBACdASoUAAsAPtFUo0uoJKMhsAgBABoJbACdMoAluhWlqV/ppk47gAD+6HKWpwv5MDVqTg1vqulCg+rola6DbErTBPmcVfxM/Hpf5Kp8FKSBeywXViqvrrhY0L0oavExpA/ZwArMmFcLUtl9SMzBKx0TQ4kyykIOZFh0eCalHIT6Jp5XeAAA","aspectRatio":1.7699115044247788,"src":"/static/43b0e4ece798c9ac8b17f16eb73252b9/ccdb5/organic-driven-development-portada.webp","srcSet":"/static/43b0e4ece798c9ac8b17f16eb73252b9/6b183/organic-driven-development-portada.webp 200w,\n/static/43b0e4ece798c9ac8b17f16eb73252b9/fc32b/organic-driven-development-portada.webp 400w,\n/static/43b0e4ece798c9ac8b17f16eb73252b9/ccdb5/organic-driven-development-portada.webp 800w,\n/static/43b0e4ece798c9ac8b17f16eb73252b9/9000d/organic-driven-development-portada.webp 1200w","sizes":"(max-width: 800px) 100vw, 800px"}}}}}},"pageContext":{"slug":"/articulos/organic-driven-development-odd/","previous":{"fields":{"slug":"/avisos_legales/politica_cookies/"}},"next":null}},"staticQueryHashes":["2032873950"]}